
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>自定义线程池并让其能够动态调整线程数 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>自定义线程池并让其能够动态调整线程数 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">一个支持动态调整的线程池通常由哪些核心组件构成？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">一个线程池通常由任务队列、工作线程集合、拒绝策略、线程工厂、动态调整策略组成。为支持动态调整，还需要增加对线程池的监控和调整机制。</div>
          </div>
          <div class="card-source">来源: 1. 定义核心结构</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在选择任务队列时，使用无界队列（如 LinkedBlockingQueue）相比有界队列（如 ArrayBlockingQueue）可能带来什么风险？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">无界队列在高并发任务时，可能因任务不断堆积而造成内存占用过高；而有界队列则需要处理相应的拒绝策略。</div>
          </div>
          <div class="card-source">来源: 2. 实现基本的线程池功能</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">文档中介绍了哪三种用于动态调整线程池大小的策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 基于任务队列长度：根据队列中待处理任务的数量来增减线程。 2. 基于任务处理时间：监控任务的平均或最大等待时间，如果时间过长则增加线程。 3. 基于CPU或系统资源：参考系统的CPU、内存等资源占用情况来动态调整。</div>
          </div>
          <div class="card-source">来源: 3. 动态调整线程数的机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在动态调整线程数时，为何要避免频繁增减，并可以采用什么措施来缓解这个问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">频繁增减线程会引起资源竞争和性能抖动。为了避免这种情况，可以设置“冷却时间”（Cooldown Period）或限制增减操作的频率。</div>
          </div>
          <div class="card-source">来源: 3. 动态调整线程数的机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在自定义线程池中，`adjustPoolSize()` 方法的核心职责是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该方法的核心职责是监控任务队列和系统资源情况，并根据预设的动态调整策略来决定是否需要增加或减少线程数量。</div>
          </div>
          <div class="card-source">来源: 4. 实现核心方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">线程池的缩减机制是如何利用 `keepAliveTime` 参数来实现的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">通过设置空闲线程的存活时间（keepAliveTime），当一个线程空闲时间超过该阈值后，它会自动销毁。这样可以在任务量减少时逐步缩减线程池的规模。</div>
          </div>
          <div class="card-source">来源: 5. 线程池的扩展与缩减</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在并发环境下修改线程集合（如扩展或缩减线程池）时，文档推荐使用什么工具来确保线程安全？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档推荐使用 Java 的 `ReentrantLock`，以确保在修改线程集合时不发生竞争，从而保证并发安全。</div>
          </div>
          <div class="card-source">来源: 5. 线程池的扩展与缩减</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">除了实现自定义监控接口，还可以使用什么技术来导出线程池的监控信息以便于外部工具观察？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以使用 JMX（Java Management Extensions）来导出线程池的监控信息，这样就可以通过外部监控工具来观察线程池的实时状态。</div>
          </div>
          <div class="card-source">来源: 6. 提供线程池的状态监控接口</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">优化</div>
          <div class="card-question">为了优化资源管理和减少开销，工作线程在完成一个任务后应该做什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">优化</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在任务结束后，工作线程不应直接销毁，而是应主动尝试从任务队列中获取新的任务来执行。这样可以复用线程，减少线程创建和销毁的成本。</div>
          </div>
          <div class="card-source">来源: 7. 优化线程资源的管理</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
